package com.zx._02_thread.线程池;

import com.zx.common.util.ThreadUtil;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;

/*
	ScheduledThreadPoolExecutor 是java中一个非常常用的定时调度的工具，其提供了两种定时调度常用模式:
	1.固定调度周期的任务执行。
	2.固定延迟间隔的任务执行，延迟间隔表示的是前一次执行完成到后一次执行开始的时间差。
*/
// 执行原理： https://mp.weixin.qq.com/s/0u75TWniU-bwa8XdDeprIA
public class ScheduledThreadPoolDemo {

    public static void main(final String[] args) {
        test3();
    }


    public static void test1() {
        final ScheduledExecutorService pool = Executors.newScheduledThreadPool(10);
        // 延迟 5秒后， 执行一次任务
        pool.schedule(() -> {
            System.out.println(1);
        }, 5, TimeUnit.SECONDS);

    }

    public static void test2() {
        final ScheduledExecutorService pool = Executors.newScheduledThreadPool(10);
        System.out.println(1);
        // 延迟 5秒后， 开始定时任务，每秒执行一次
        pool.scheduleWithFixedDelay(() -> {
            System.out.println(1);
        }, 5, 1, TimeUnit.SECONDS);

        // 延迟 5秒后， 开始定时任务，每秒执行一次
        System.out.println(2);
        pool.scheduleAtFixedRate(() -> {
            System.out.println(2);
        }, 5, 1, TimeUnit.SECONDS);

    }

    public static void test3() {
        final ScheduledExecutorService pool = Executors.newScheduledThreadPool(10);
        // 延迟 5秒后， 开始定时任务，每秒执行一次
        final ScheduledFuture<?> future = pool.scheduleWithFixedDelay(() -> {
            System.out.println(1);
        }, 1, 1, TimeUnit.SECONDS);

        ThreadUtil.sleep(3);
        // 关闭定时任务
        future.cancel(true);
        pool.shutdown();

    }
}
